home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / programming / other / jikes / src / lookup.h < prev    next >
C/C++ Source or Header  |  1999-05-14  |  16KB  |  747 lines

  1. // $Id: lookup.h,v 1.5 1999/02/12 14:39:13 shields Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #ifndef lookup_INCLUDED
  11. #define lookup_INCLUDED
  12.  
  13. #include "config.h"
  14. #ifndef __amigaos__
  15. #include <wchar.h>
  16. #endif
  17. #include <string.h>
  18. #include <sys/stat.h>
  19. #include <time.h>
  20. #include "tuple.h"
  21. #include "long.h"
  22. #include "double.h"
  23.  
  24. class Symbol;
  25. class PackageSymbol;
  26. class TypeSymbol;
  27. class MethodSymbol;
  28. class MethodShadowSymbol;
  29. class BlockSymbol;
  30. class VariableSymbol;
  31. class VariableShadowSymbol;
  32. class LabelSymbol;
  33. class LiteralSymbol;
  34. class NameSymbol;
  35.  
  36. class PathSymbol;
  37. class DirectorySymbol;
  38. class FileSymbol;
  39.  
  40. class ShadowSymbol;
  41.  
  42. class LiteralValue;
  43. class IntLiteralValue;
  44. class LongLiteralValue;
  45. class FloatLiteralValue;
  46. class DoubleLiteralValue;
  47. class Utf8LiteralValue;
  48.  
  49. class Utf8LiteralTable;
  50. class NameLookupTable;
  51. class LiteralLookupTable;
  52.  
  53. class AstBinaryExpression;
  54. class AstExpression;
  55.  
  56. class Hash
  57. {
  58. public:
  59.     //
  60.     // HASH takes as argument a pointer to a character string    
  61.     // and its length which it hashes it into a location in the name  
  62.     // hash table.                                                    
  63.     //
  64.     inline static unsigned Function(wchar_t *head, int len)
  65.     {
  66.         unsigned long hash_value = head[len >> 1]; // start with center (or unique) letter
  67.         wchar_t *tail = &head[len - 1];
  68.  
  69.         for (int i = 0; i < 5 && head < tail; i++)
  70.         {
  71.             unsigned k = *tail--;
  72.             hash_value += ((k << 7) + *head++);
  73.         }
  74.  
  75.         return hash_value;
  76.     }
  77.  
  78.     //
  79.     // Same as above function for a regular "char" string.
  80.     //
  81.     inline static unsigned Function(char *head, int len)
  82.     {
  83.         unsigned long hash_value = head[len >> 1]; // start with center (or unique) letter
  84.         char *tail = &head[len - 1];
  85.  
  86.         for (int i = 0; i < 5 && head < tail; i++)
  87.         {
  88.             unsigned k = *tail--;
  89.             hash_value += ((k << 7) + *head++);
  90.         }
  91.  
  92.         return hash_value;
  93.     }
  94.  
  95.     inline static unsigned Function(IEEEfloat value)
  96.     {
  97.         return value.Word();
  98.     }
  99.  
  100.     inline static unsigned Function(IEEEdouble value)
  101.     {
  102.         unsigned result = value.HighWord() + value.LowWord();
  103.         return result;
  104.     }
  105. };
  106.  
  107.  
  108. class DirectoryEntry
  109. public:
  110.     DirectoryEntry *next;
  111.     int length;
  112.     char *name;
  113.  
  114.     DirectoryEntry() : name(NULL),
  115.                        directory(NULL),
  116.                        next(NULL),
  117.                        length(0),
  118.                        mtime_(0)
  119.     {
  120.         image = this;
  121.     }
  122.  
  123.     virtual ~DirectoryEntry()
  124.     {
  125.         delete [] name;
  126.     }
  127.  
  128.  
  129.     inline void Initialize(DirectorySymbol *directory_, char *name_, int length_)
  130.     {
  131.         directory = directory_;
  132.         length = length_;
  133.         name = new char[length + 1];
  134.         memmove(name, name_, length * sizeof(char));
  135.         name[length] = U_NULL;
  136.  
  137.         return;
  138.     }
  139.  
  140.     inline void Initialize(DirectoryEntry *entry, char *name_, int length_)
  141.     {
  142.         Initialize(entry -> directory, name_, length_);
  143.     }
  144.  
  145.     time_t Mtime();
  146.  
  147.     bool IsDummy() { return this != image; }
  148.  
  149.     //
  150.     // See FoldedDirectoryEntry for an explanation of the use of this function
  151.     //
  152.     virtual DirectoryEntry *Image() { return this; }
  153.  
  154. protected:
  155.     DirectorySymbol *directory;
  156.     DirectoryEntry *image;
  157.     time_t mtime_;
  158. };
  159.  
  160.  
  161. #ifdef WIN32_FILE_SYSTEM
  162. //
  163. // This object is needed only for systems such as Windows NT/95/98 that
  164. // treat filenames in a case-insensitive fashion.
  165. //
  166. class FoldedDirectoryEntry : public DirectoryEntry
  167. {
  168. public:
  169.     FoldedDirectoryEntry(DirectoryEntry *image_) { DirectoryEntry::image = image_; }
  170.     virtual ~FoldedDirectoryEntry() {}
  171.  
  172.     virtual DirectoryEntry *Image() { return image; }
  173. };
  174. #endif
  175.  
  176.  
  177. class DirectoryTable
  178. {
  179. public:
  180.     Tuple<DirectoryEntry *> entry_pool;
  181.  
  182.     DirectoryTable(int estimate = 1024);
  183.     ~DirectoryTable();
  184.  
  185.     DirectoryEntry *FindEntry(char *, int);
  186.     DirectoryEntry *InsertEntry(DirectorySymbol *, char *, int);
  187.  
  188. #ifdef WIN32_FILE_SYSTEM
  189.     //
  190.     // See FoldedDirectoryEntry for an explanation of the use of this function
  191.     //
  192.     DirectoryEntry *FindCaseInsensitiveEntry(char *, int);
  193.     void InsertCaseInsensitiveEntry(DirectoryEntry *);
  194. #endif
  195.  
  196. private:
  197.     enum
  198.     {
  199.         DEFAULT_HASH_SIZE = 1021,
  200.         MAX_HASH_SIZE = 8191
  201.     };
  202.  
  203.     DirectoryEntry **base;
  204.     int hash_size;
  205.  
  206.     static int primes[];
  207.     int prime_index;
  208.  
  209.     inline static unsigned Hash(char *head, int len) { return Hash::Function(head, len); }
  210.  
  211.     void Rehash();
  212. };
  213.  
  214.  
  215. class Symbol
  216. public:
  217.     Symbol  *next;
  218.  
  219.     enum SymbolKind
  220.     {
  221.          NONE,
  222.          NAME,
  223.          PACKAGE,
  224.          TYPE, // class or interface
  225.          METHOD,
  226.          BLOCK,
  227.          VARIABLE,
  228.          LABEL,
  229.          LITERAL,
  230.  
  231.          PATH,
  232.          _DIRECTORY,
  233.          _FILE,
  234.  
  235.          _num_kinds
  236.     };
  237.  
  238.     SymbolKind Kind() { return _kind; }
  239.     virtual wchar_t *Name()   { return (wchar_t *) NULL; }
  240.     virtual int NameLength() { return 0; }
  241.     virtual NameSymbol *Identity() { return (NameSymbol *) NULL; }
  242.  
  243.     PackageSymbol        *PackageCast()        { return (PackageSymbol *) (_kind == PACKAGE ? this : NULL); }
  244.     TypeSymbol           *TypeCast()           { return (TypeSymbol *) (_kind == TYPE ? this : NULL); }
  245.     MethodSymbol         *MethodCast()         { return (MethodSymbol *) (_kind == METHOD ? this : NULL); }
  246.     BlockSymbol          *BlockCast()          { return (BlockSymbol *) (_kind == BLOCK ? this : NULL); }
  247.     VariableSymbol       *VariableCast()       { return (VariableSymbol *) (_kind == VARIABLE ? this : NULL); }
  248.     LabelSymbol          *LabelCast()          { return (LabelSymbol *) (_kind == LABEL ? this : NULL); }
  249.     LiteralSymbol        *LiteralCast()        { return (LiteralSymbol *) (_kind == LITERAL ? this : NULL); }
  250.     NameSymbol           *NameCast()           { return (NameSymbol *) (_kind == NAME ? this : NULL); }
  251.  
  252.     PathSymbol           *PathCast()           { return (PathSymbol *) (_kind == PATH ? this : NULL); }
  253.     DirectorySymbol      *DirectoryCast()      { return (DirectorySymbol *) (_kind == _DIRECTORY ? this : NULL); }
  254.     FileSymbol           *FileCast()           { return (FileSymbol *) (_kind == _FILE ? this : NULL); }
  255.  
  256.     virtual ~Symbol() {}
  257.  
  258. protected:
  259.     SymbolKind _kind;
  260. };
  261.  
  262.  
  263. class LiteralValue
  264. public:
  265.     LiteralValue *next;
  266.     int constant_pool_index,
  267.         constant_pool_class;
  268.  
  269.     virtual ~LiteralValue() {}
  270. };
  271.  
  272.  
  273. class IntLiteralValue : public LiteralValue
  274. public:
  275.     int value;
  276.  
  277.     virtual ~IntLiteralValue() {}
  278.  
  279.     void Initialize(int value_)
  280.     {
  281.         value = value_;
  282.         LiteralValue::constant_pool_index = 0;
  283.         LiteralValue::constant_pool_class = 0;
  284.     }
  285. };
  286.  
  287.  
  288. class LongLiteralValue : public LiteralValue
  289. public:
  290.     LongInt value;
  291.  
  292.     virtual ~LongLiteralValue() {}
  293.  
  294.     void Initialize(LongInt value_)
  295.     {
  296.         value = value_;
  297.         LiteralValue::constant_pool_index = 0;
  298.         LiteralValue::constant_pool_class = 0;
  299.     }
  300. };
  301.  
  302.  
  303. class FloatLiteralValue : public LiteralValue
  304. public:
  305.     IEEEfloat value;
  306.  
  307.     virtual ~FloatLiteralValue() {}
  308.  
  309.     void Initialize(IEEEfloat value_)
  310.     {
  311.         value = value_;
  312.         LiteralValue::constant_pool_index = 0;
  313.         LiteralValue::constant_pool_class = 0;
  314.     }
  315. };
  316.  
  317.  
  318. class DoubleLiteralValue : public LiteralValue
  319. public:
  320.     IEEEdouble value;
  321.  
  322.     virtual ~DoubleLiteralValue() {}
  323.  
  324.     void Initialize(IEEEdouble value_)
  325.     {
  326.         value = value_;
  327.         LiteralValue::constant_pool_index = 0;
  328.         LiteralValue::constant_pool_class = 0;
  329.     }
  330. };
  331.  
  332.  
  333. class Utf8LiteralValue : public LiteralValue
  334. public:
  335.     char *value;
  336.     int  length;
  337.     int  constant_pool_index_String, // index when used as String
  338.          constant_pool_index_Class;  // index when used as Class
  339.  
  340.     Utf8LiteralValue() : value(NULL)
  341.     {}
  342.  
  343.